// HTTP request utility for uniapp
const BASE_URL = 'http://127.0.0.1:8000' // Change to your backend URL
export { BASE_URL }

// 不需要认证的API路径列表
const PUBLIC_APIS = [
  '/api/auth/login/',
  '/api/auth/register/'
]

// Request function with token handling
export const request = (options) => {
  return new Promise((resolve, reject) => {
    // Set headers
    const header = {
      'Content-Type': 'application/json'
    }
    
    // 检查是否是公开API
    const isPublicApi = PUBLIC_APIS.some(api => options.url === api)
    
    // 如果不是公开API，则添加token认证
    if (!isPublicApi) {
      // Get token from storage
      const token = uni.getStorageSync('token')
      console.log('Current token:', token) // Debug log
      
      // Add token if available
      if (token) {
        header['Authorization'] = `Bearer ${token}`
        console.log('Using Authorization header:', header['Authorization']) // Debug log
      } else {
        // If no token, try to get userInfo and check if user is logged in
        const userInfo = uni.getStorageSync('userInfo')
        const hasLogin = uni.getStorageSync('hasLogin')
        console.log('No token, userInfo:', userInfo, 'hasLogin:', hasLogin) // Debug log
        
        // 如果没有token，但声称已登录，则清除无效的登录状态
        if (hasLogin || userInfo) {
          // 清除可能存在的无效登录状态
          uni.removeStorageSync('hasLogin')
          uni.removeStorageSync('token')
          uni.removeStorageSync('refreshToken')
          uni.removeStorageSync('userInfo')
        }
        
        // Redirect to login if not logged in
        uni.showToast({
          title: '请先登录',
          icon: 'none'
        })
        
        setTimeout(() => {
          uni.navigateTo({
            url: '/pages/login/login'
          })
        }, 1500)
        
        return reject('未登录，请先登录')
      }
    } else {
      console.log('访问公开API，无需认证:', options.url)
    }
    
    // 增强调试输出，显示完整URL和参数
    const fullUrl = BASE_URL + options.url;
    const queryParams = options.params ? '?' + Object.entries(options.params)
      .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
      .join('&') : '';
      
    console.log(`Sending ${options.method || 'GET'} request to ${fullUrl}${queryParams}`, 
      'Data:', options.data || {}, 
      'Params:', options.params || {});
    
    // Make request
    uni.request({
      url: fullUrl,
      method: options.method || 'GET',
      data: options.method === 'GET' ? options.params : options.data,
      header: header,
      timeout: 10000, // 10 seconds timeout
      success: (res) => {
        console.log('Response:', res) // Debug log
        
        // Check if unauthorized
        if (res.statusCode === 401 || res.statusCode === 403) {
          // Clear token and redirect to login
          uni.removeStorageSync('token')
          uni.showToast({
            title: '登录已过期或权限不足，请重新登录',
            icon: 'none'
          })
          
          // Redirect to login page
          setTimeout(() => {
            uni.redirectTo({
              url: '/pages/login/login'
            })
          }, 1500)
          
          reject(res.data || '未授权，请重新登录')
          return
        }
        
        // Handle server errors
        if (res.statusCode >= 500) {
          uni.showToast({
            title: '服务器错误，请稍后再试',
            icon: 'none'
          })
          reject(res.data || '服务器错误')
          return
        }
        
        // Handle HTTP 405 - Method Not Allowed specifically
        if (res.statusCode === 405) {
          const errorData = {
            detail: res.data.detail || `方法 "${options.method}" 不被允许。请联系开发人员修复此问题。`,
            status: 405,
            message: '接口方法不支持'
          }
          console.error('405 Method Not Allowed:', errorData)
          reject(errorData)
          return
        }
        
        // Handle client errors
        if (res.statusCode >= 400 && res.statusCode < 500) {
          // 转换响应为更统一的错误格式
          const errorData = {
            detail: res.data.detail || res.data.message || '请求参数错误',
            status: res.statusCode,
            message: '请求失败'
          }
          
          uni.showToast({
            title: errorData.detail,
            icon: 'none'
          })
          reject(errorData)
          return
        }
        
        // Success - 确保返回的数据格式统一
        if (!res.data.code && res.statusCode === 200) {
          // 如果后端没有返回code字段，但状态码是200，添加code字段
          res.data = {
            code: 200,
            message: 'success',
            data: res.data
          }
        }
        resolve(res.data)
      },
      fail: (err) => {
        console.error('Request failed:', err) // Debug log
        
        // Check if it's a network error
        if (err.errMsg && err.errMsg.includes('request:fail')) {
          uni.showToast({
            title: '无法连接到服务器，请检查网络或联系管理员',
            icon: 'none',
            duration: 3000
          })
          
          // For development: show more detailed error
          console.error(`连接失败: 请确保后端服务器在 ${BASE_URL} 运行中`)
        } else {
          uni.showToast({
            title: '网络请求失败',
            icon: 'none'
          })
        }
        
        reject(err)
      }
    })
  })
} 